package org.Yiran.timetale_re.worldgen;

import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraftforge.common.world.BiomeModifier;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import org.Yiran.timetale_re.Timetale_re;
import org.Yiran.timetale_re.worldgen.feature.CrystalClusterFeature;
import org.Yiran.timetale_re.worldgen.feature.EnergyCrystalClusterFeature;
import org.Yiran.timetale_re.worldgen.feature.config.CrystalClusterConfig;

/**
 * 世界生成管理类
 * <p>
 * 这个类负责管理模组的所有世界生成相关内容，
 * 包括特征配置、放置配置以及生物群系修饰符等。
 * 其他类可以通过此类来注册和管理自己的世界生成逻辑。
 * </p>
 */
public class ModWorldGen {
    
    /**
     * 生物群系修饰符注册器
     * 用于注册自定义的生物群系修饰符
     */
    public static final DeferredRegister<BiomeModifier> BIOME_MODIFIERS =
            DeferredRegister.create(ForgeRegistries.Keys.BIOME_MODIFIERS, Timetale_re.MODID);
            
    /**
     * 特征注册器
     * 用于注册自定义的特征类型
     */
    public static final DeferredRegister<Feature<?>> FEATURES = 
            DeferredRegister.create(ForgeRegistries.FEATURES, Timetale_re.MODID);

    /**
     * 水晶簇特征注册对象
     */
    public static final RegistryObject<Feature<CrystalClusterConfig>> CRYSTAL_CLUSTER_FEATURE = 
            FEATURES.register("crystal_cluster", () -> new CrystalClusterFeature(CrystalClusterConfig.CODEC));
    
    /**
     * 能晶簇特征注册对象
     */
    public static final RegistryObject<Feature<CrystalClusterConfig>> ENERGY_CRYSTAL_CLUSTER_FEATURE = 
            FEATURES.register("energy_crystal_cluster", () -> new EnergyCrystalClusterFeature(CrystalClusterConfig.CODEC));

    /**
     * 注册世界生成相关内容
     * <p>
     * 此方法应在模组主类的构造函数中调用，以正确注册所有世界生成相关的内容
     * </p>
     *
     * @param modEventBus 模组事件总线
     */
    public static void register(IEventBus modEventBus) {
        // 注册生物群系修饰符
        BIOME_MODIFIERS.register(modEventBus);
        
        // 注册特征类型
        FEATURES.register(modEventBus);
        
        // 注册配置特征和放置特征
        ModConfiguredFeatures.register(modEventBus);
        ModPlacedFeatures.register(modEventBus);
        
        // 注册生物群系修饰符序列化器
        ModBiomeModifierRegister.BIOME_MODIFIER_SERIALIZERS.register(modEventBus);
    }

}